package com.xlh.service.courseTest;

import com.xlh.dto.course.StatisticsDTO;
import com.xlh.dto.courseTest.*;
import com.xlh.dto.user.ClassCourseDTO;
import com.xlh.enums.courseTest.AnswerSheetStatusEnum;
import com.xlh.pojo.courseTest.CourseTestPaper;
import com.xlh.pojo.courseTest.CourseTestPaperAnswerSheet;

import java.util.List;
import java.util.Map;

/**
 * @author zhr 2019/3/2
 */
public interface PaperAnswerSheetService {

    /**
     * 对每一个学生插入答题卡记录
     *
     * @param paperId    试卷id
     * @param studentIds 学生id
     */
    void insertNewAnswerSheet(Long paperId, List<Long> studentIds);

    CourseTestPaperAnswerSheet selectByPrimaryKey(Long id);

    /**
     * 更新答题卡内容
     */
    void updateAnswerSheet(CourseTestPaperAnswerSheet answerSheet);

    List<AnswerSheetListDTO> selectStudentList(String userInfo, Long paperId);

    CourseTestPaperAnswerSheet selectByPaperIdAndStudentId(Long paperId, Long userId);

    /**
     * 是否全部批阅
     */
    boolean allChecked(Long paperId);

    /**
     * @param paperId 试卷id
     * @return 试卷id
     */
    List<CourseTestPaperAnswerSheet> selectEndedPaperByPaperId(Long paperId);

    /**
     * 回收脏数据
     */
    void cleanData();

    /**
     * 缓存录入答题卡填写情况
     */
    void put(Long paperId, Long answerSheetId, List<AnswerSheetDTO> answerSheetList);

    /**
     * 缓存读取答题卡填写情况
     */
    List<AnswerSheetDTO> get(Long paperId, Long answerSheetId);

    /**
     * 移除答题卡缓存
     */
    void remove(Long paperId, Long answerSheetId);

    /**
     * 清空答题卡缓存
     */
    void clearCache();

    /**
     * 获取答题卡信息，适用于在考试过程中的频繁调用
     */
    CourseTestPaperAnswerSheet getAnswerSheet(Long id);

    /**
     * 根据课程id、批阅状态获取答题卡
     */
    List<PaperAnswerSheetDTO> selectByCourseIdPaperStat(Long courseId, Integer stat);

    /**
     * 学生是否正在考试
     */
    boolean isTesting(List<Long> userIds, Long courseId);

    boolean isTestings(List<Long> userIds, List<Long> courseIds);

    /**
     * 查询所有正在批阅的试卷
     */
    StatisticsDTO getClassCheckCount(List<Long> classIds, Long courseId);
    /**
     * 查询所有正在批阅的试卷
     */
    StatisticsDTO getClassCheckCountOther(List<Long> classIds, Long courseId);

    CourseTestPaperAnswerSheet insertAndReturn(Long userId, Long paperId);

    /**
     * 获取答题卡,若查询不到答题卡,则插入答题卡信息并返回
     */
    CourseTestPaperAnswerSheet selectInsert(Long userId, Long paperId);

    /**
     * 考试过程中保存答题记录
     */
    void save(Long answerSheetId, List<AnswerSheetTypeDTO> answerSheetTypeList, Long paperId);

    /**
     * 理论题交卷
     */
    Integer submitBase(Long answerSheetId, List<AnswerSheetTypeDTO> answerSheetTypeList, Long paperId);

    /**
     * 实验题交卷
     */
    void submitExperiment(Long answerSheetId, Long paperId);

    void setUpdate(
            CourseTestPaperAnswerSheet answerSheet,
            List<AnswerSheetTypeDTO> answerSheetTypeList,
            AnswerSheetStatusEnum statusEnum
    );

    void saveCache();

    /**
     * 结束考试
     */
    void endTest(Long paperId);

    /**
     * 学生考试成绩列表
     */
    List<CourseTestPaper> listStudentExam(Long courseId, Long userId);

    List<Long> getTestingCourse(List<Long> classIds);

    void deleteByPaperId(Long paperId);

    /**
     * 查询所有正在批阅的试卷
     */
    StatisticsDTO getClassCheckCount(Map<Long, List<ClassCourseDTO>> courseIdClassIdsMap);


    /**
     * 目的：查询每个学生的考试情况
     * 参数：Long courseId、Long classId 、List<Long> userIds
     * 返回值：List<考试对象> 必须包含：考试id、考试名称、学生分数、试卷总分、考试时间、courseId、classId、userId
     */
    List<UserCourseTestInfoDTO> findTestStatisticsByUserIds(Long courseId, Long classId, List<Long> userIds );


    /**
     * 查询要导出的实验报告的信息
     * @param paperId
     * @return
     */
    List<AnswerSheetExprimentInfoDTO> getExperimentInfo(Long paperId);


    List<CourseTestPaperAnswerSheet> selectByPrimaryKeys(List<Long> answerSheetListIds);

}
